package Fisica;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import Hibernate.Vehiculo;

public abstract class VehiculoFisica {

	
	//Busca un Vehiculo a partir de un identificador OK
    public static Vehiculo findById(Integer id) {
  	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Vehiculo as v where v.idvehiculo = '"+id+"'");
	        List<Vehiculo> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Vehiculo");
	        		return new Vehiculo();
	        	}
	        else {	System.out.println("Se encontro el Vehiculo!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Vehiculo a partir de un objeto Vehiculo OK
	public static Vehiculo find(Vehiculo c) {
		return VehiculoFisica.findById(c.getIdvehiculo());
    }
    
  //Busca un Vehiculo a partir de un identificador OK
    public static Vehiculo findByMM(String marca, String mod)  {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	                
	        Query query = session
	        .createQuery("from Vehiculo as v " +
	        		"where v.marca = '"+marca+"' and v.modelo = '"+mod+"'");
	        List<Vehiculo> list = query.list();
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
	
	        if (list.isEmpty()) 
	        	{	System.out.println("No se encontro el Vehiculo");
	        		return new Vehiculo();
	        	}
	        else {	System.out.println("Se encontro el Vehiculo!!!");
	        		return list.get(0);
	        	}
	       }catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
   }
    
  //Busca un Vehiculo a partir de un identificador OK
    public static List<Vehiculo> list() {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session
		     .createQuery("from Vehiculo as o order by o.idvehiculo asc");
		    List<Vehiculo> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
  //Busca Vehiculos a partir de una marca OK
    public static List<Vehiculo> listByMarca(String marca) {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session
		     .createQuery("from Hibernate.Vehiculo as v where v.marca = '"+marca+"' order by v.modelo");
		    List<Vehiculo> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
  //Busca Vehiculos a partir de marcas OK
    public static List<Vehiculo> listaDeMarcas() {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session
		     .createQuery("from Hibernate.Vehiculo as v group by v.marca order by v.marca");
		    List<Vehiculo> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
    //Busca Vehiculos a partir de categorias OK
    public static List<Vehiculo> listaDeCategorias() {
    	try {
	    	Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
		    session.beginTransaction();
		                
		    Query query = session
		     .createQuery("from Hibernate.Vehiculo as v group by v.tipo order by v.tipo");
		    List<Vehiculo> list = query.list();
		        
		    session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
		        								   //El commit cierra automnticamente la session.
		    SessionFactoryUtil.getSessionFactory().close();
		
		    return list;	 
    	}catch (RuntimeException re) {
			System.out.println("get failed: "+re);
			throw re;
		}
   }
    
    
  //Agrego un Vehiculo a la base OK
	public static void add(Vehiculo v) {
		try{
			Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el Vehiculo no exista para agregarlo
	        Query query = session
	        .createQuery("from Vehiculo as v where v.marca = '"+v.getMarca()+"' and v.modelo = '"+v.getModelo()+"'");
	        List<Vehiculo> list = query.list();
	
	        if (list.isEmpty())
	        {
	        	session.save(v);
	        	System.out.println("Vehiculo agregado con exito!!!");
	        }
	        
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. 
	        								   //El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
	}
	
	//Actualizacion de un Vehiculo OK
	public static void update(Vehiculo c) {
		try{
	        Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession();
	        session.beginTransaction();
	        
	        //chekeo que el Vehiculo no exista para agregarlo 
	        System.out.println("chekeo que el Vehiculo no exista para agregarlo ");
	        if (c.getIdvehiculo() != 0) {
	        	session.saveOrUpdate(c);
	            System.out.println("Vehiculo actualizado con exito!!!");
	        }
	               
	        session.getTransaction().commit(); //Como ya se ha hecho la consulta, hago commit. El commit cierra automnticamente la session.
	        SessionFactoryUtil.getSessionFactory().close();
		}catch (RuntimeException re) {
				System.out.println("get failed: "+re);
				throw re;
			}
    }
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
//		Vehiculo ch;		
		int x = 1;
		String s = "Luciano";
//		Vehiculo c = VehiculoFisica.findById(x);
//		Vehiculo c = VehiculoFisica.findByNombre(s);
//		Vehiculo c = VehiculoFisica.findById(x);
//		c.setIdVehiculo(1);
//		System.out.println("c.getIdvehiculo(): "+c.getIdvehiculo() );
//		System.out.println("c.getMarca(): "+c.getMarca() );
//		System.out.println("c.getModelo(): "+c.getModelo() );
//		System.out.println("c.getTipo(): "+c.getTipo() );
//		
//		System.out.println("c.getIdvehiculo() == 0: "+(c.getIdvehiculo() == 0) );
		
//		List<Vehiculo> l = VehiculoFisica.list();
//		System.out.println("ID  |    APELLIDO   |  NOMBRE  |   DIRECCION  |   TELEFONO   |  EMAIL");
//		for (Vehiculo cl : l) {
//			System.out.print(cl.getIdVehiculo() );
//			System.out.print(" | ");
//			System.out.print(cl.getApellido() );
//			System.out.print(" | ");
//			System.out.print(cl.getNombre());
//			System.out.print(" | ");
//			System.out.print(cl.getDireccion() );
//			System.out.print(" | ");
//			System.out.print(cl.getTelefono() );
//			System.out.print(" | ");
//			System.out.println(cl.getEmail() );		
//		} 
		
//		Vehiculo cu = new Vehiculo();
//		cu.setIdVehiculo(6);
//		cu.setApellido("apellidoV");
//		cu.setNombre("nombreV");
//		cu.setDireccion("calleV 333");
//		cu.setTelefono("33648");
//		cu.setEmail("viejo@mail.com");
//		
//		
//		VehiculoFisica.update(cu);
		
		String marca ="volk";
		listByMarca(marca);
		
		List<Vehiculo> l = VehiculoFisica.listByMarca(marca);
		for (Vehiculo cl : l) {
			System.out.print(cl.getIdvehiculo() );
			System.out.print(" | ");
			System.out.print(cl.getMarca() );
			System.out.print(" | ");
			System.out.print(cl.getModelo());
			System.out.print(" | ");
			System.out.print(cl.getTipo() );
			System.out.println(" | ");
				
		} 
			

	}

}
